julia.m version 01Jul23
(A Julia set explorer)

Author: Paul Mennen
Email:  paul@mennen.org

Introduction

Julia set images are traditionally generated by repeated application of the equation z = z2 + c (z and c are complex). The color of the image is determined by the number of iterations it takes for the magnitude of z to grow larger than some fixed value (2.0 for this program). The Mandelbrot set uses the same equation and the same color assignment method but differs in how the equation is initialized.

It's easy to find dozens of Julia set graphing programs in nearly every language (including Matlab), so I wouldn't fault you if you were skeptical of the need for yet another application with this purpose. However, my goal was to show how fun it is to explore Julia sets and to make this application more compelling than any similar application out there. I'll let you be the judge of how well I have met this challenge.

Program initialization

Start this application by typing "julia" at the command prompt. (julia.m calls the other .m files supplied). When julia.m starts, it creates two images which we refer to as the left and right images (or sometimes the "opposite" image to refer to the right image when we are editing the left and vice versa). Initially, both images show the traditional Mandelbrot set (i.e. with the exponent equal to two). The images will look identical (i.e. the same axis limits, the same color map, the same color depth, and the same resolution), however after taking any action, the two images will no longer be the same as in the screen capture shown here. There is nothing special about the left or right image. Any action we can take on the right image can also be taken on the left. However, you will soon see the benefits of having two images to play with. (Click on this screen capture to view it in its full resolution.)

The Julia set exponent

There are two controls related to selecting the Julia set. The first control, labeled "exp", is located near the lower-left corner of each image and determines the exponent (e) used in the recurrence relation z = ze + c which determines the color of each point on the image. Although 2 is the most common exponent used for Julia sets, other integer exponents are also used (the generalized Julia set). The easiest way to change the exponent is to use the edit object's "auto-increment" mode (i.e. click on the right side of the exponent to increase its value by one and click on the left side to decrease its value). The image will immediately update to reflect the new exponent. Non-integer values may also be used, which often produce even wilder images. The easiest way to enter a non-integer value is to right click on the exponent and then type in whatever value you want. Sometimes it is useful to be able to change the auto-increment value from one to some other value. Suppose you want to change this from 1 to 0.1. Simply right-click on the edit object and type in "0.1i". After you press return, the auto-increment value will change to the entered value. (You can think of the "i" at the end as referring to "increment".) This is especially useful for creating animated Julia sets because holding down the mouse button continues to modify the exponent, which often yields eye-popping animations. With the default settings the display update rate will probably be too slow for this purpose, but below you will find methods described to increase the update rate. This method of changing the auto-increment value and continuous incrementing can be used with any edit pseudo object and will also be useful for creating animations by changing the Julia constant (described next).

The Julia set constant

The second control related to selecting the Julia set is a popup menu located near the upper left corner of each image (which initially appears as the yellow label "Mandelbrot"). Assuming the exponent is at its default value (2), this is the popup that will appear when you click on that label. For the first selection of the popup (Mandelbrot) z is initialized to zero and c is chosen to correspond to the position we are determining the color for. For the remaining selections (Julia sets), z is initialized to the value corresponding to the pixel we are determining the color for, and then the recurrence relation is computed using one of the 14 constants shown in this popup menu. These 14 constants were chosen somewhat haphazardly although with the goal of creating interesting images. After one of the constants is chosen, the real and complex components of the constant are placed in edit pseudo objects so they may be modified easily. The default autoincrement amount is set to .01 but this may be modified by entering an increment value as described above. And as before, Julia set animations may be created by holding down the mouse to slide the real or imaginary components of the constant around the Julia set landscape while looking for interesting territory. If you change the Julia set exponent from 2 to any other value, the list of constants in the popup menu shrinks from 14 to 4. (This is to simplify the task of placing the constants in interesting territory.) Notice that the four choices given continue to change as you change the exponent. They change in an attempt to remain in interesting territory and this generally is successful for relatively small (i.e. less than 10) whole-number exponents. This is also at least somewhat successful for small fractional exponents. Instead of opening up the Julia set constant popup with a left click, you will probably find it more convenient to use the right mouse button instead. This will scroll thru the various Julia set constants (updating the image and the edit boxes for the real and imaginary parts of the constant) without having to open up the pseudo popup menu. After the last constant in the menu is selected, the next right click will cycle you back to the Mandelbrot set.

Zooming the image

To appreciate the beauty and complexity of Julia sets you need to zoom into ever smaller regions of the set. The flexible and intuitive zoom features of this application are what makes it fun to use and set it apart from the many dozens of Julia set graphing programs you can find. There are many ways to zoom an image (see the Zooming and panning section), but the easiest method for this application is to double click the mouse while holding the mouse button down after the 2nd click. Then drag the mouse while continuing to hold down the mouse button. As you do this, a zoom box will be drawn - expanding in size as you drag the mouse. Even during this zoom box drawing operation, the opposite image will display the portion of the data inside the zoom box, behaving much like a magnifying glass. The smaller the zoom box, the higher the magnification and the more pixilated the image will appear. However, once you let go of the mouse button, the magnified region is recomputed to the currently specified resolution (1 bit per pixel by default) at which point you will be able to see details in the image that were not visible before. If you find the double click and drag method awkward, you might try clicking both mouse buttons at the same time and holding them down while you drag. (My testing indicates that this works when you are using Matlab version 2014a or any earlier version, but not in more recent versions.) If you don't mind using the keyboard for this, another method requiring less dexterity is to hold the keyboard shift button down while dragging the mouse from the first corner to the opposite corner of the zoom box. (No double clicking required). This method works with all versions of Matlab.

Moving the zoom box

You can change the zoom box using one or more of these methods:

Magnification

Usually, after the zoom window is drawn and you see the full detail in the magnified region you see something in the magnified region that you want to see in yet more detail. Use the same method to draw a zoom box again. In this manner, you can bounce back and forth between the left and right images, getting higher and higher magnifications on smaller regions of the Julia set. Notice that below the plot, the magnification is shown compared with the original scaling (i.e. when the Julia set was first plotted). In the example shown here, the magnification is 4.09e7 which means that the area being displayed is 40 million times smaller than the original image. The edit boxes on the left show that the x values shown in the displayed region are between .31787 and .31825 (approximately). More digits are displayed than typical for these edit boxes because of the extreme magnification often used for plotting Julia sets. Similarly, the y axis limits are shown in the two right-hand edit boxes. Right below the plot, the number of times the recurrence relation was computed to generate the image is shown (289 iterations in this example). You will notice that as you zoom in to higher magnifications, more iterations are computed since this is necessary to achieve the same detail level. The magnification readout can also be used as a zoom control. Simply left-click on it to zoom out by a factor of 100 (in area), or zoom out to the original axis limits by right-clicking instead. You can also experiment with panning the image (just click and drag the mouse inside the image) or do that with the right mouse button instead to Zoom in or out (without using a zoom box). Left or right-clicking the Zout tag will zoom out or in by a small amount (doubling or halving the area), although usually, you will find you want the large zoom factors available with the other methods.

The sync check box

The method described above for zooming to higher and higher magnifications (by alternating between the left and right images) is probably the easiest way; however, you may want to zoom into a region on one image without changing the image on the opposite side. For instance, you may be interested in comparing two different regions of a Julia set or comparing the same region of two different Julia sets. In such situations, you should uncheck the sync checkbox (just to the left of the "Magnification: 4.09e7" indicator in the above screen capture). This changes the plot from the "automatic sync" mode to the "manual sync" mode. To prevent automatic synchronization in both directions, you must uncheck the sync checkbox under both image plots.

Once in manual sync mode, after drawing a zoom box you will see no changes to the image right away except for the existence of the zoom box. You can follow the drawing of a zoom box with one or more of these actions: Even in manual sync mode you sometimes may want to synchronize the two displays. This is done by RIGHT-clicking on the sync checkbox (which will not toggle the checkmark like the left click does). Right-clicking on the sync box under the left-hand image when a zoom box is visible in the left-hand image will copy the data inside the zoom box to the right-hand image and then recompute the right image so that it is displayed in the full requested resolution. If you do the same thing when no zoom box is visible, then the entire left-hand image is copied to the right image. You might expect that the right and left images would look exactly the same after such an operation, and in fact this is usually the case. However, there are two display parameters (the depth parameter and the pixels per bit parameter, are both discussed below) that are not transferred during the sync operations. This means that one side may show more or less detail than the other side after a sync operation.

The pixels/bit parameter and the depth parameter

When you are using the edit box auto-increment feature to cycle thru small changes in the Julia set exponent or the Julia set constant a fast update rate is essential to finding interesting regions of the Julia sets. The update rate is probably going to be too slow for this purpose when using the default settings, however, there are three things you can do to speed this up. The first is to make the figure window smaller. You may have already tried expanding the figure to full-screen mode, and indeed this does produce large images with great detail. However, the update rate will be slower since it increases proportionally with the number of pixels. Shrinking the figure will conversely speed up the update rate, although if you shrink the figure too much, the controls will become too small to use easily.

The second way you can speed up the update rate is to reduce the number of times the recursion formula is executed. This is done using the depth parameter which can be changed using the edit box just above the menubox near the lower left corner of each image. When you select a new Julia set (by changing the Julia set exponent or constant) a default depth (usually 50) is chosen which produces a pleasing image for that particular set. Try setting the depth to 5 and notice that the display updates 10 times faster. Then notice as you click the mouse on the different colors of the image the Z value (which appears just above the sync checkbox) will range from zero to five and the image will include no more than six colors. Z=0 indicates that the recurrence relation never exceeded a magnitude of 2, and Z=5 indicates that the recurrence relation exceeded a magnitude of 2 on the 5th iteration. The number of iterations only matches the depth setting when the magnification is equal to one. As you zoom in, the iterations automatically increase. (The number of iterations doubles every time the magnification is increased by a factor of 1000.)

The last (and strongest) influence you can make on the update rate is the pixels/bit setting. The default setting is "one" indicating that the color for each pixel of the image is determined independently. Thus for a 500 by 500 pixel image, the recurrence relation must be repeated 250 thousand times for each iteration. However, if you change the pixels/bit setting (just above the image) to 3 (for example) you reduce the computations by a factor of 9 since each 3x3 block of pixels will be assigned the same color. The resulting blocky image is not as pleasing, but it is still fine for finding the interesting regions where you want to focus your interest. You can use higher settings (lower resolutions) as well, but 3 is probably as high as you will need to go to get acceptable update rates. In fact, a setting of 2 will often be sufficiently fast as well.

The color map selectors

If you click on one of the vertical color bars to the left of each image, a new mapping between the Z values and the image colors will be selected. There are 10 different color maps and after selecting the 10th one, clicking again will select the first one again. Also right-clicking will cycle thru the color maps in the reverse order. Most of the color maps are designed to make it easy for you to see the general shape of the surface contour (i.e. high vs low areas) based on the image color. However two of the color maps (colorcube and lines) are designed to allow you to see as many level transitions as possible, and the general shape of the contour is difficult to discern (and impossible with the lines color map). Clicking on the color bar next to the left image only changes the color map for that image, so this makes it easy to compare two identical Julia sets colored with different maps. However, if you are using a version of Matlab older than version 2014b you will find that changing the left color map automatically changes the right color map (and vice versa). This is because those versions only allow one color map at a time to be associated with any figure window.

Initial help text

When this application first starts, some very basic help text appears in the left image (white characters). Although it can't substitute for the full help information in this document, it may be enough to get you started. As soon as you click in the plot area or make any changes to the fractal parameters, the help text disappears so it doesn't interfere with viewing the fractals.


I hope you enjoy exploring Julia and Mandelbrot sets using this program.
Please let me know if you have any questions or comments about this application.

Copyright © 2024
Paul Mennen